有一天,我在找一個「有網頁介面、支援多任務排程」的工具時,看見了 Cronicle。
看起來比 Linux 的 crontab
好懂一些,而且也能管理多台主機,我決定動手實作。
這篇記錄了我如何從一台乾淨的 Ubuntu 終端機,部署一套可自動備份、可遠端瀏覽的 Cronicle 系統。
在閱讀官方文件後,我發現有兩種方式可以安裝 Cronicle:
方式 | 特點 |
---|---|
curl 安裝原生版 | 適合有 root 權限、想直接部署在本機的使用者 |
Docker 版(含 Compose) | 適合用容器管理、未來好備份與升級 |
我選擇了第二種:使用 soulteary/docker-cronicle
這個社群提供的 Docker 封裝版本。
下面是我實際操作的流程:
git clone https://github.com/soulteary/docker-cronicle.git
cd docker-cronicle
docker-compose.yml
,我確認了這段:
volumes:
- ./data:/opt/cronicle/data
docker compose up -d
,幾分鐘後看到容器啟動完成。透過 docker ps
我查到容器的 3012 port 已對外開放,從同網段的電腦上打開 http://10.122.23.xxx:3012
就能進入 Cronicle 的 Web UI。
預設帳密是 admin / admin
,建議第一時間改密碼。
所有設定資料都存在 /opt/cronicle/data
,這也是為什麼「volume 映射」非常關鍵。
以下是一些需要注意的情況與建議:
情境 | 風險 | 解法 |
---|---|---|
沒設 volume 映射 | 容器刪除後資料會消失 | 用 - ./data:/opt/cronicle/data 保護 |
誤刪 ./data | 資料永久消失 | 建議定期 tar 備份 |
volume 掛錯路徑 | 容器重建時資料歸零 | 確認 compose 設定與路徑一致 |
Docker 映像版本變更太快 | 舊資料格式不兼容 | 建議固定 tag,不用 latest |
容器內部誤刪 /opt/cronicle/data | 主機資料同步被刪 | 除非必要,避免進容器直接操作 |
我設計了一支 shell script,讓 Cronicle 每天凌晨備份自己的資料夾。
#!/bin/bash
BACKUP_DIR="/opt/cronicle-backup"
SOURCE_DIR="/opt/cronicle/data"
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
BACKUP_FILE="${BACKUP_DIR}/cronicle_backup_${TIMESTAMP}.tar.gz"
mkdir -p "${BACKUP_DIR}"
tar -czf "${BACKUP_FILE}" -C "${SOURCE_DIR}" .
find "${BACKUP_DIR}" -type f -name "*.tar.gz" -mtime +7 -delete
把它掛進 volume,再到 Cronicle 裡建一個 Shell Script 類型的 Job 就能定期備份。
如果你用的是「Web Plugin」來呼叫 HTTP 任務(例如 .ashx),只要回傳的是 HTTP 200,就算內容有錯誤,Cronicle 也會當成功。
我原本寫了一支 CheckHostStatus.ashx
,會檢查多台主機的狀態、寫入資料庫、發 LINE 通知,但 HTTP 回應始終是 200。
解法有兩種:
.ashx
中偵測是否有錯誤,若有就設 Response.StatusCode = 500
exit 1
控制錯誤判定後來我選擇在程式末加上這段:
if (hasAnyError)
{
context.Response.StatusCode = 500;
context.Response.StatusDescription = "Host check failed";
}
讓 Cronicle 能正確判斷任務是否真的成功。
但如果你的 .ashx
已經包了所有邏輯、紀錄與告警,其實讓 Cronicle 當作「每天來觸發一次的鬧鐘」就好,也不需要它來判斷結果成敗。
如何在 Docker 中部署 Cronicle 並持久化資料?
請幫我建立 Cronicle 的備份腳本與排程設定
docker-compose.yml 怎麼寫才能保存設定與日誌?
cronicle 如何在多台機器之間同步?
cronicle 的 config.json 哪些欄位必須要設?